import java.io.*;
import java.util.*;

public class Piramide {
	
	private String[] lineasPiramide;
	private ArrayList<int[]> numsPiramide, numsPiramideSumados;
	private int posicion = 0;
	
	public Piramide() {
		this.lineasPiramide = new String[5];
		this.cargarFichero();
		this.numsPiramide = new ArrayList<int[]>();
		this.numsPiramideSumados = new ArrayList<int[]>();
		this.llenarPiramides();
		this.sumarPadresHijos();
		this.buscarCamino();
	}
	
	public void llenarPiramides() {
		for (int i = 0; i < lineasPiramide.length; i++) {
			int[] array = new int[i + 1];
			int[] array2 = new int[i + 1];
			for (int j = 0; j < array.length; j++) {
				if (j == 0) {
					posicion = 0;
				}
				if (lineasPiramide[i].indexOf(32, posicion) != -1) {
					array[j] = Integer.parseInt(lineasPiramide[i].substring(posicion, lineasPiramide[i].indexOf(32, posicion)));
					array2[j] = Integer.parseInt(lineasPiramide[i].substring(posicion, lineasPiramide[i].indexOf(32, posicion)));
					posicion = lineasPiramide[i].indexOf(32, posicion) + 1;
				}
				else {
					array[j] = Integer.parseInt(lineasPiramide[i].substring(posicion));
					array2[j] = Integer.parseInt(lineasPiramide[i].substring(posicion));
				}					
			}	
			numsPiramide.add(array);
			numsPiramideSumados.add(array2);
		}			
	}
	
	public void sumarPadresHijos() {
		for (int i = 0; i < numsPiramideSumados.size(); i++) {
			for (int j = 0; j < numsPiramideSumados.get(i).length; j++) {
				//si no es la primera linea sumo el padre
				if (i != 0) {
					//si es el primer numero de la linea le sumo el unico padre
					if (j == 0) {
						numsPiramideSumados.get(i)[j] += numsPiramideSumados.get(i - 1)[j];
					}
					else {
						//si es el ultimo numero de la linea le sumo el unico padre
						if (j == numsPiramideSumados.get(i).length - 1) {
							numsPiramideSumados.get(i)[j] += numsPiramideSumados.get(i - 1)[j - 1];
						}
						//si no es ni el primero ni el ultimo comparo los dos padres y le sumo el mayor
						else {
							if (numsPiramideSumados.get(i - 1)[j - 1] > numsPiramideSumados.get(i - 1)[j]) {
								numsPiramideSumados.get(i)[j] += numsPiramideSumados.get(i - 1)[j - 1];
							}
							else {
								numsPiramideSumados.get(i)[j] += numsPiramideSumados.get(i - 1)[j];
							}
						}
					}
				}				
				//si no es la ultima linea comparo los hijos y le sumo el mayor
				if (i != numsPiramideSumados.size() - 1) {
					if (numsPiramideSumados.get(i + 1)[j] > numsPiramideSumados.get(i + 1)[j + 1]) {
						numsPiramideSumados.get(i)[j] += numsPiramideSumados.get(i + 1)[j];
					}
					else {
						numsPiramideSumados.get(i)[j] += numsPiramideSumados.get(i + 1)[j + 1];
					}
				}				
			}				
		}		
	}
	
	public void buscarCamino() {
		int posicion = 0;
		int suma = numsPiramide.get(0)[0];
		System.out.print(suma+" + ");
		for (int i = 0; i < numsPiramide.size() - 1; i++) {
			if (numsPiramideSumados.get(i + 1)[posicion] > numsPiramideSumados.get(i + 1)[posicion + 1]) {
				suma += numsPiramide.get(i + 1)[posicion];
				System.out.print(numsPiramide.get(i + 1)[posicion]);
			}
			else {
				suma += numsPiramide.get(i + 1)[posicion + 1];
				System.out.print(numsPiramide.get(i + 1)[posicion + 1]);
				posicion++;
			}
			if (i != numsPiramide.size() - 2) {
				System.out.print(" + ");
			}
		}
		System.out.println(" = "+suma);
	}
	
	public void cargarFichero() {	
		String entrada;
		try {				
			FileReader fichero = new FileReader ("src/piramidekk.txt");
			BufferedReader fE = new BufferedReader (fichero);	
			entrada = fE.readLine();
			for (int i = 0; i < lineasPiramide.length; i++) {
				lineasPiramide[i] = entrada;				
				entrada = fE.readLine();
			}			
			fE.close();
		}
		catch (Exception e) {	
			e.getStackTrace();			
		}			
	}

}
